let tree = {
    "id": 0,
    "name": "root",
    "left": {
        "id": 1,
        "name": "Simon",
        "left": {
            "id": 3,
            "name": "Carl",
            "left": {
                "id": 7,
                "name": "Lee",
                "left": {
                    "id": 11,
                    "name": "Fate"
                }
            },
            "right": {
                "id": 8,
                "name": "Annie",
                "left": {
                    "id": 12,
                    "name": "Saber"
                }
            }
        },
        "right": {
            "id": 4,
            "name": "Tony",
            "left": {
                "id": 9,
                "name": "Candy"
            }
        }
    },
    "right": {
        "id": 2,
        "name": "right",
        "left": {
            "id": 5,
            "name": "Carl",
        },
        "right": {
            "id": 6,
            "name": "Carl",
            "right": {
                "id": 10,
                "name": "Kai"
            }
        }
    }
}

function getKeys(obj) {
    for (const key in obj) {
        if (obj[key] instanceof Object) {
            getKeys(obj[key])
        } else {
            console.log(key);
        }
    }
}

// 假设id和name均不会重复，根据输入name找到对应的id
function findIdByName(name) {
    function loop(obj) {
        if (!obj) {
            throw "你的对象根本不存在"
        }
        for (const key in obj) {
            const element = obj[key]
            if (obj[key] == name) {
                console.log(obj.id);
            }
            if (obj[key] instanceof Object) {
                loop(obj[key])
            }
        }
    }
    loop(tree)
}

// 假设id和name均不会重复，根据输入id找到对应的name
function findNameById(id) {
    function loop(obj) {
        if (!obj) {
            throw "你的对象根本不存在"
        }
        for (const key in obj) {
            const element = obj[key]
            if (obj[key] == id) {
                console.log(obj.name);
            }
            if (obj[key] instanceof Object) {
                loop(obj[key])
            }
        }
    }
    loop(tree)
}


// 把这个对象中所有的名字以“前序遍历”的方式全部输出到console中
// 先序遍历：首先访问根，再先序遍历左（右）子树，最后先序遍历右（左）子树
function getListWithDLR() {
    let visit = function (obj) {
        if (obj.name) { console.log("前序遍历 ->" + obj.name) }
        if (obj.left) { visit(obj.left) }
        if (obj.right) { visit(obj.right) }
    }
    visit(tree)
}
getListWithDLR()
// 把这个对象中所有的名字以“中序遍历”的方式全部输出到console中
// 中历序遍：首先中序遍历左（右）子树，再访问根，最后中序遍历右（左）子树
function getListWithLDR() {
    let visit = function (obj) {
        if (obj.left) { visit(obj.left) }
        if (obj.name) { console.log("中历序遍 ->" + obj.name) }
        if (obj.right) { visit(obj.right) }
    }
    visit(tree)
}
getListWithLDR()
// 把这个对象中所有的名字以“后序遍历”的方式全部输出到console中
// 后序遍历：首先后序遍历左（右）子树，再后序遍历右（左）子树，最后访问根
function getListWithLRD() {
    let visit = function (obj) {
        if (obj.right) { visit(obj.right) }
        if (obj.left) { visit(obj.left) }
        if (obj.name) { console.log("后序遍历 ->" + obj.name) }
    }
    visit(tree)
}
getListWithLRD()